package BehavioralPattern.Strategy;

import BehavioralPattern.Strategy.NoStrategy.NoStrategySale;
import BehavioralPattern.Strategy.Strategy.SaleContext;
import BehavioralPattern.Strategy.StrategyEnum.SaleEnum;

/**
 * @Classname : StrategyClient
 * @Description : 测试策略模式
 * 行为型——策略模式
 * 一、模式定义
 *   Define a family of algorithms, encapsulate each one, and make them interchangeable.
 *   定义一组算法，将每个算法都封装起来，并且使它们之间可以互换。
 *   优点：
 *     算法可自由切换
 *     避免使用多重条件判断
 *     容易扩展
 *   缺点：
 *     每个策略都是一个类，复用的可能性小，类数量增多
 *     所有策略类都需要对外暴露，高层模块需要知道有哪些策略，才能决定知道使用哪一个。（可使用枚举和工厂方法模式优化）
 * 二、模式类图
 *   https://kdocs.cn/l/cc6y05veRSRV
 * 三、适用场景
 *   1、当多个类只有在算法或行为上不同时
 *   2、当算法需要自由切换时（如技术前沿行业，算法随时都在进化）
 * 四、应用举例
 *   1、工具类
 *
 * @Author : chentianyu
 * @Date 2023/2/26 11:03
 */


public class StrategyClient {
    public static void main(String[] args) {
        System.out.println("—————————无策略————————");
        NoStrategySale noStrategySale = new NoStrategySale();
        noStrategySale.sell("新顾客", 100);
        noStrategySale.sell("老顾客", 100);
        noStrategySale.sell("淡季抛售", 100);

        System.out.println("—————————策略模式————————");
        SaleContext newCustomerSaleContext = new SaleContext(new NewCustomerSaleStrategy());
        newCustomerSaleContext.sell(100);
        SaleContext oldCustomerSaleContext = new SaleContext(new OldCustomerSaleStrategy());
        oldCustomerSaleContext.sell(100);
        SaleContext offSeasonSaleContext = new SaleContext(new OffSeasonSaleStrategy());
        offSeasonSaleContext.sell(100);

        System.out.println("—————————策略枚举————————");
        SaleEnum.NEW_CUSTOMER_SALE.sell(100);
        SaleEnum.OLD_CUSTOMER_SALE.sell(100);
        SaleEnum.OFF_SEASON_SALE.sell(100);
    }
}

/** 20230226
 * —————————无策略————————
 * 新顾客原价出售：100.00 元
 * 老顾客九折出售：90.00 元
 * 淡季八折抛售：80.00 元
 * —————————策略模式————————
 * 新顾客原价出售：100.00 元
 * 老顾客九折出售：90.00 元
 * 淡季八折抛售：80.00 元
 * —————————策略枚举————————
 * 新顾客原价出售：100.00 元
 * 老顾客九折出售：90.00 元
 * 淡季八折抛售：80.00 元
 */
